#include "tcp_chat_bar.h"

void sigHandle (int sig)
{
    status = FINISH;
}

// 客户端收发例程
void* clientSendAndReceiveRoutine (void* arg)
{
    // 客户端连接信息指针
    ClientConnMsg_st_pt clientConnMsgStPt;

    // 初始化客户端连接信息
    clientConnMsgStPt = (ClientConnMsg_st_pt)arg;

    while (status == RUNNING) 
    {
        // 重置读、写缓冲区
        bzero(clientConnMsgStPt->rdBufPt, clientConnMsgStPt->bufSize);
        bzero(clientConnMsgStPt->wtBufPt, clientConnMsgStPt->bufSize);
        // 输入写缓冲区
        fgets(clientConnMsgStPt->wtBufPt, clientConnMsgStPt->bufSize, stdin);
        // 处理写缓冲区内容
        clientConnMsgStPt->wtBufPt[strlen(clientConnMsgStPt->wtBufPt) - 1] = '\0';
        // 发送写缓冲区内容
        write(clientConnMsgStPt->connSockFd, clientConnMsgStPt->wtBufPt, strlen(clientConnMsgStPt->wtBufPt));
        if (
            // 接受内容到读缓冲区
            read(clientConnMsgStPt->connSockFd, clientConnMsgStPt->rdBufPt, clientConnMsgStPt->bufSize) > 0
        )
        {
            // 服务器回弹
            // 打印服务器回弹数据
            printf("%s\n", clientConnMsgStPt->rdBufPt);
        }
    }

    // 退出线程
    pthread_exit(NULL);
}

int main(int argc, char const *argv[])
{
    if (argc < 3)
    {
        fprintf(stderr, "提示: ./client <端口> <服务器IP>\n");
        exit(-1);
    }

    // 客户端连接信息指针
    ClientConnMsg_st_pt clientConnMsgStPt;
    // 线程池信息指针
    ThreadsPoolMsg_st_pt trdsPolMsgStPt;

    // 设置信号处理
    signal(SIGINT, sigHandle);
    // 获取客户端连接信息
    clientConnMsgStPt = getNewClientConnMsg(argv[1], argv[2], 100);
    // 客户端请求连接服务器
    if (
        clientConnect2Server(clientConnMsgStPt) == -1
    )
    {
        perror("连接失败");
        destroyClientConnMsg(clientConnMsgStPt);
        exit(-2);
    }
    printf("连接成功\n");
    // 获取线程池信息
    trdsPolMsgStPt = getNewThreadsPoolMsg(1,1,1);
    // 添加通信任务
    addNewTask(trdsPolMsgStPt, clientSendAndReceiveRoutine, (void*)clientConnMsgStPt);

    // 销毁线程池信息
    destroyThreadsPoolMsg(trdsPolMsgStPt);
    // 销毁客户端连接信息
    destroyClientConnMsg(clientConnMsgStPt);
}
